package cn.yh.nft.turbo.base.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @ClassName: SpringContextHolder
 * @Author: 草莓爱上啵啵
 *
 *      Spring上下文
 *      这是一个 Spring 工具类，用于在静态方法中获取 Spring 容器中的 Bean。
 *      implements ApplicationContextAware：实现该接口以获取 ApplicationContext 的引用
 *      通过实现 ApplicationContextAware 接口获取 Spring 容器上下文
 *      提供静态方法以便在其他地方（特别是静态上下文中）方便地获取 Spring 管理的 Bean
 *      提供了两种获取 Bean 的方式：按名称获取和按类型获取
 */
@Component
public class SpringContextHolder implements ApplicationContextAware {

    /**
     * 静态变量，用于存储 Spring 应用程序上下文（ApplicationContext）的引用
     */
    private static ApplicationContext applicationContext;


    /**
     * setApplicationContext：ApplicationContextAware 接口的方法实现
     * 当 Spring 容器初始化时，Spring 会自动调用此方法注入 ApplicationContext
     * @param applicationContext 将传入的 applicationContext 参数赋值给静态变量 applicationContext
     * @throws BeansException 创建Bean异常
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextHolder.applicationContext = applicationContext;
    }


    /**
     * 静态方法，通过 Bean 的名称获取 Spring 容器中的 Bean
     * @param name 要获取的 Bean 的名称
     * @return 对应的 Bean 对象（Object 类型）
     */
    public static Object getBean(String name){
        return applicationContext.getBean(name);
    }

    /**
     * 静态泛型方法，通过 Bean 的类类型获取 Spring 容器中的 Bean
     * @param name 要获取的 Bean 的 Class 对象
     * @return 对应的 Bean 对象（已转换为指定类型 T）
     * @param <T> 泛型T
     */
    public static <T> T getBean(Class<T> name){
        return applicationContext.getBean(name);
    }
}
